// @ts-ignore
import { ConfigEnv, defineConfig, loadEnv, normalizePath, UserConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import VueJsx from "@vitejs/plugin-vue-jsx";
import UnoCSS from "unocss/vite";
import VueSetupExtend from "vite-plugin-vue-setup-extend";

import viteCompression from "vite-plugin-compression";
import ElementPlus from "unplugin-element-plus/vite";
// @ts-ignore
import AutoImport from "unplugin-auto-import/vite";
// @ts-ignore
import Components from "unplugin-vue-components/vite";
// @ts-ignore
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { ViteEjsPlugin } from "vite-plugin-ejs";
import topLevelAwait from "vite-plugin-top-level-await";
import { resolve } from "path";

import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
// @ts-ignore
import PurgeIcons from "vite-plugin-purge-icons";
import * as path from "path";

// 全局 scss 文件的路径
// 用 normalizePath 解决 window 下的路径问题
const variablePath = normalizePath(path.resolve("./src/styles/variables.scss"));

// 当前执行node命令时文件夹的地址(工作目录)
const root: string = process.cwd();

// 路径查找
function pathResolve(dir: string): string {
  return resolve(root, ".", dir);
}

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }: ConfigEnv): UserConfig => {
  console.log("root：" + root);
  console.log("command：" + command);
  console.log("mode：" + mode);

  let env = {} as any;

  if (command === "serve") {
    // dev 独有配置
  } else {
    // command === 'build'
    // build 独有配置
  }

  console.log("process.argv大小:" + process.argv.length);
  console.log("process.argv0:" + process.argv[0]);
  console.log("process.argv1:" + process.argv[1]);
  console.log("process.argv2:" + process.argv[2]);
  console.log("process.argv3:" + process.argv[3]);
  console.log("process.argv4:" + process.argv[4]);

  env = loadEnv(mode, root);

  console.log(env);

  return {
    base: env.VITE_BASE_PATH,
    root: root,
    // ↓服务器配置
    server: {
      // 端口号
      port: env.VITE_PORT,
      host: "0.0.0.0",
      open: env.VITE_OPEN === "true"
    },
    // ↓插件配置
    plugins: [
      vue(),
      VueJsx(),
      UnoCSS(),
      // script setup 支持name
      VueSetupExtend(),
      // 压缩
      viteCompression({
        verbose: true, // 是否在控制台输出压缩结果
        disable: false, // 是否禁用
        threshold: 10240, // 体积大于 threshold 才会被压缩,单位 b
        algorithm: "gzip", // 压缩算法,可选 [ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
        ext: ".gz", // 生成的压缩包后缀
        deleteOriginFile: false //压缩后是否删除源文件
      }),
      // 自动引入组件 element-plus 样式
      ElementPlus({}),
      // 自动导入ts
      AutoImport({
        include: [
          /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
          /\.vue$/,
          /\.vue\?vue/, // .vue
          /\.md$/ // .md
        ],
        // 自动导入 Vue vue-router 相关函数 不用自己手动import
        imports: ["vue", "vue-router"],
        // 配置文件生成位置，默认是根目录 /auto-imports.d.ts
        dts: "src/types/auto-imports.d.ts",
        // 自动导入element plus相关函数，如：ElMessage, ElMessageBox..
        resolvers: [ElementPlusResolver()],
        eslintrc: {
          // 当enabled为true时，会根据filepath生成一个eslint的配置文件,一旦生成配置文件之后
          // 最好把enable关掉，即改成false。否则这个文件每次会在重新加载的时候重新生成，这会导致eslint有时会找不到这个文件。当需要更新配置文件的时候，再重新打开吧
          enabled: false, // Default `false`
          filepath: "./.eslintrc-auto-import.json", // Default `./.eslintrc-auto-import.json`
          globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
        }
      }),
      // 自动导入组件
      Components({
        // dirs 指定组件所在位置，默认为 src/components
        dirs: ["src/components"],
        // 组件的有效文件扩展名
        extensions: ["vue"],
        // 搜索子目录
        deep: true,
        include: [/\.vue$/, /\.vue\?vue/],
        // 配置文件生成位置，默认是根目录 /components.d.ts，生成自定义 `auto-components.d.ts` 全局声明
        dts: "src/types/auto-components.d.ts",
        // 自定义组件的ui库解析器 自动导入element plus 相关组件
        resolvers: [ElementPlusResolver()],
        exclude: [/[\\/]node_modules[\\/]/]
      }),
      // 增加ejs 语法支持
      ViteEjsPlugin({ env }),
      // 模块顶层中使用await
      topLevelAwait({
        // https://juejin.cn/post/7152191742513512485
        // The export name of top-level await promise for each chunk module
        promiseExportName: "__tla",
        // The function to generate import names of top-level await promise in each chunk module
        promiseImportName: i => `__tla_${i}`
      }),
      // icon
      PurgeIcons(),
      createSvgIconsPlugin({
        iconDirs: [pathResolve("src/assets/svgs")],
        symbolId: "icon-[dir]-[name]",
        svgoOptions: true
      })
    ],
    // ↓CSS配置
    css: {
      preprocessorOptions: {
        scss: {
          // additionalData 的内容会在每个 scss 文件的开头自动注入
          additionalData: `@import "${variablePath}";`,
          javascriptEnabled: true
        }
      }
    },
    // ↓解析配置
    resolve: {
      // 导入时想要省略的扩展名列表
      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".scss", ".css"],
      //↓路径别名
      alias: [
        {
          find: /\@\//,
          replacement: `${pathResolve("src")}/`
        }
      ]
    },
    // ↓构建配置
    build: {
      minify: "terser", // 构建 哪种混淆器
      outDir: env.VITE_OUT_DIR || "dist", // 打包输出路径
      sourcemap: env.VITE_SOURCEMAP === "true" ? "inline" : false, // source map
      terserOptions: {
        compress: {
          drop_debugger: env.VITE_DROP_DEBUGGER === "true", // 是否删除debugger
          drop_console: env.VITE_DROP_CONSOLE === "true" // 是否删除console log
        }
      }
    }
  };
});
